Virtual Texture
全库目录221
本文目录8
巨大纹理中只有少量区域可见,整级加载会带入大量暂时用不到的内容。虚拟纹理把每级mip切成页,让逻辑页映射到有限的物理槽位。采样地址、缺页回退和槽位寿命必须一起成立,否则会出现接缝、错误页面或闪烁。
逻辑页与物理槽
以下模型使用正方形纹理,基级有N×N页,N为2的幂;每页内部为B×B纹素,边框宽b。本文页网格模型只覆盖整数层级 0 <= m <= log2(N)。第m级有 n=N/2^m 页,单个物理槽的边长为 S=B+2b。所有坐标先限定到[0,1),Wrap材质先取小数部分,Clamp材质则处理1处的页索引上界。
给定虚拟UV,目标页坐标和页内位置为:
页表键是(m,p.x,p.y),表项至少记录槽坐标、有效位与内容版本。若槽坐标为s、物理缓存尺寸为C纹素,归一化采样坐标为:
除法逐分量执行。这采用连续纹素边界坐标,页内第一个纹素中心对应f=0.5/B;公式不能再额外加半纹素。例:N=2、B=4、b=1,UV=(0.5625,0.0625)落在基级页(1,0)的首个纹素中心。该页映射到槽(1,0)、缓存为12×12时,物理UV为(7.5/12,1.5/12)。
到 m=log2(N) 时,整张纹理缩成一页,但这一页仍有 B×B 个内部纹素。完整纹理链更粗的 B/2、B/4 至 1×1 级属于尾部 mip,需要单独存放、打包或采用能够隔离过滤的布局;不能把本页的整数页数公式继续除到小于一。本文地址模型对这些层级明确报超范围,不把它们误报为缺少驻留祖先。产品也可以选择截断最粗层:UE5.6文档说明最低分辨率mip受Tile尺寸限制,高频内容可能因此出现混叠;这属于具体实现的画质取舍。
缺页回退
目标页未驻留时,记录该目标键用于反馈,然后依次查找更粗层。每到一层都按该层n重新计算p和f,不能保留细页的局部坐标。例如UV=(0.75,0.25)在基级页(1,0)内的局部位置是(0.5,0.5),回退到唯一根页后却应读取根页的(0.75,0.25)。
系统必须钉住根页或定义始终可用的占位纹理。祖先存在是资源保证;查询所有祖先仍未命中时应报告非法驻留状态。反馈去重后才进入IO队列,上传完成前继续使用祖先。
reference.py的vt_address展开了目标页、祖先搜索与物理地址计算。页表可直接保存最佳可用祖先以减少查询,但每次发布新映射时都要维护这项一致性。
过滤与页边框
逻辑邻页在缓存中通常不相邻。每页边框应复制同一级mip的逻辑邻接纹素;仅重复本页边缘会改变跨页信号,产生接缝。纹理外边界再按全局Wrap或Clamp规则生成。边框开销为 (B+2b)^2/B^2-1,B=128、b=4时约为12.9%。
过滤核的足迹必须留在正确填充的区域内。较宽的各向异性核可能超过边框,需限制各向异性、增加边框或拆分采样。不能对整个物理缓存直接生成普通mip链,因为相邻槽可能属于无关页面。三线性过滤通常分别查询相邻两个虚拟mip并混合,或由等价的专门布局处理;硬件跨物理槽缩小不能代替这一步。
物理UV包含页号跳变,直接对它求导会在页边界产生巨大梯度。先由原始虚拟UV求导,选定驻留层后将梯度按 n*B/C 缩放,再用显式梯度采样。若缓存只提供单级页图像,应采用与该布局一致的过滤策略。
槽位发布与回收
槽位替换先使未来页表不再指向旧内容,再等待旧页表版本的录制保留退出,以及所有已提交的读取工作结束。已录制但尚未提交的命令仍可消费旧映射,完成值之外还要保留这份引用,具体协议见GPU资源生命周期。然后上传新页和边框,完成同步,最后发布带新版本的映射。仅等待上传完成不足以保护仍读取旧页的帧。
页表采用逐帧版本或双缓冲时,还要跟踪每个版本的完成值;CPU完成IO也不表示GPU纹理已可采样。缓存容量、在途上传和等待回收槽分别记账,防止把同一槽重复分配。
运行时虚拟纹理
运行时虚拟纹理把地形、道路或材质结果渲染到页中。消费方的地址机制相同,生产方还要维护脏页、更新频率和依赖。源材质变化而页未失效时会读到陈旧结果;页级更新也需要与正在使用该页的消费者同步。
设页表版本7把逻辑页A指向槽3,GPU帧20仍在读取版本7。CPU想把槽3给B,先准备版本8移除A,但不能立刻覆盖槽3:帧20依然可能按旧表读取。等帧20的完成值到达,再上传B及其边框;上传完成并建立采样依赖后,版本9才发布B→槽3。版本8期间A回退祖先,B也继续缺页。
如果先上传B、再删除A的映射,A会短暂显示B的内容;如果只修改当前页表却忽略在途旧版本,也有相同风险。页表版本与槽内容版本共同决定一次采样的身份。
验证方法
给每页填唯一颜色并叠加页号,分别检查页边界、父页回退和槽位循环替换。测试相机瞬移、反馈延迟与缓存不足,记录实际驻留层、缺页数量和从请求到可用的帧数。过滤测试使用逻辑上连续、物理上不相邻的页。
运行 python -B 知识库/examples/revision_06_08/test_reference.py 验证页首纹素中心、祖先局部坐标、无回退错误,以及非2的幂网格和超出模型尾部层级的拒绝。CPU模型只计算地址;页表纹理、GPU反馈、RVT写入、跨页过滤和性能均为尚未验证。
相关主题
参考资料
- Epic,Streaming Virtual Texturing,UE5.6:2026-10-22核读页面粒度、性能、Tile Border限制与反应式流送;本文地址公式是明确布局下的独立推导。
- Epic,Runtime Virtual Texturing:运行时页面内容生成与消费者关系;实际工程配置与捕获另验。